package keer.httpinterface;

import java.io.*;
import java.nio.file.Files;

/**
 * HttpFile类用于封装HTTP请求中的文件信息
 * 它提供了不同的构造方式，使得文件可以从本地文件系统、字节数组或输入流创建
 */
public class HttpFile {
    // 文件名
    private final String filename;
    // 文件内容的输入流
    private final InputStream input;

    /**
     * 通过本地文件创建HttpFile对象
     * 此构造函数调用了其他构造函数，避免代码重复
     *
     * @param file 本地文件对象，用于创建HttpFile
     * @throws IOException 如果文件读取过程中发生错误
     */
    public HttpFile(File file) throws IOException {
        this(file.getName(), file);
    }

    /**
     * 通过文件名和本地文件创建HttpFile对象
     * 此构造函数调用了其他构造函数，避免代码重复
     *
     * @param filename 文件名
     * @param input    本地文件对象
     * @throws IOException 如果文件读取过程中发生错误
     */
    public HttpFile(String filename, File input) throws IOException {
        this(filename, Files.newInputStream(input.toPath()));
    }

    /**
     * 通过文件名和输入流创建HttpFile对象
     * 此构造函数初始化了filename和input字段
     *
     * @param filename 文件名
     * @param input    文件内容的输入流
     */
    public HttpFile(String filename, InputStream input) {
        this.filename = filename;
        this.input = input;
    }

    /**
     * 通过文件名和字节数组创建HttpFile对象
     * 此构造函数通过创建一个ByteArrayInputStream来转换字节数组为输入流
     *
     * @param filename 文件名
     * @param bytes     文件内容的字节数组
     */
    public HttpFile(String filename, byte[] bytes) {
        this(filename, new ByteArrayInputStream(bytes));
    }

    /**
     * 获取文件名
     *
     * @return 文件名
     */
    public String getFilename() {
        return filename;
    }

    /**
     * 获取文件内容的输入流
     *
     * @return 文件内容的输入流
     */
    public InputStream getInput() {
        return input;
    }
}
